-- SdkMgr
-- Created by chengb Nov/21/2015
-- sdk管理器
-- 由于目前SdkMgr的初始化是在UIAutoPatch的构造函数中进行的，这时被require的文件无法自动更新
-- 如果期望文件被更新，需要使用myRequire函数

module("SdkMgr", package.seeall);

local PURE_FILE = "SdkMgr";

-- Java 回调函数列表
local javaCallbackList = {};

-- 已经require的文件
local requiredFiles = {};

-- 内部函数声明

-- 初始化sdk
function init()
    assert(type(PUBLISH_PLATFORM) == "string", "必须配置PUBLISH_PLATFORM");

    myRequire("game/sdk/SdkMacros");
    myRequire("game/sdk/SdkAgent");
    myRequire("game/sdk/PurchaseToolkit");
    myRequire("game/sdk/android/JavaInterfaces");

    if type(PAY_SDK) == "table" then
        for i = 1, #PAY_SDK do
            if PAY_SDK[i] == "mycard" then
                -- 初始化mycard代理
                myRequire("game/sdk/android/MyCardAgent");
                MyCardAgent.init();
            elseif PAY_SDK[i] == "bluepay" then
                -- 初始化bluepay代理
                myRequire("game/sdk/android/BluePayAgent");
                BluePayAgent.init();
            elseif PAY_SDK[i] == "mol" then
                -- 初始化MOL代理
                myRequire("game/sdk/android/MOLAgent");
                MOLAgent.init();
            end
        end
    end

    if TALKING_DATA_ENABLED == 1 then
        -- 初始化Talkingdata SDK
        myRequire("game/sdk/TalkingdataAgent");
        TalkingdataAgent.init();
    end

    if WECHAT_ENABLED == 1 then
        -- 初始化微信代理
        myRequire("game/sdk/android/WechatAgent");
        WechatAgent.init();
    end

    if WEIBO_ENABLED == 1 then
        -- 初始化微博代理
        myRequire("game/sdk/android/WeiboAgent");
        WeiboAgent.init();
    end

    -- GooglePlay平台
    if PUBLISH_PLATFORM == PUBLISH_TYPE_GOOGLE_PLAY then
        myRequire("game/sdk/android/GooglePlayAgent");
        myRequire("game/sdk/AppsFlyerAgent");

        -- 初始化GooglePlay代理
        GooglePlayAgent.init();

        -- 初始化AppsFlyer代理
        AppsFlyerAgent.init();

    -- 青瓷平台
    elseif PUBLISH_PLATFORM == PUBLISH_TYPE_QC then
        -- 初始化支付宝代理
        myRequire("game/sdk/android/AlipayAgent");
        AlipayAgent.init();

    -- UC九游平台
    elseif PUBLISH_PLATFORM == PUBLISH_TYPE_UC then
        -- 初始化UC代理
        myRequire("game/sdk/android/UCAgent");
        UCAgent.init();

    -- 亚马逊平台
    elseif PUBLISH_PLATFORM == PUBLISH_TYPE_AMAZON then
        myRequire("game/sdk/android/AmazonAgent");
        myRequire("game/sdk/AppsFlyerAgent");

        -- 初始化亚马逊代理
        AmazonAgent.init();

        -- 初始化AppsFlyer代理
        AppsFlyerAgent.init();

    -- 小米平台
    elseif PUBLISH_PLATFORM == PUBLISH_TYPE_MI then
        myRequire("game/sdk/android/MIAgent");
        MIAgent.init();

    -- 雷霆平台
    elseif PUBLISH_PLATFORM == PUBLISH_TYPE_LT then
        myRequire("game/sdk/android/LeiTingAgent");
        LeiTingAgent.init();
    end

    if isAndroidPlatform() then
        -- 通知sdk初始化完成
        local debugMode = iif(DEBUG_MODE == 1, 1, 0);
        callJavaFunc("notifySdkInitOk", {PUBLISH_PLATFORM, debugMode}, "(Ljava/lang/String;I)V");
    end
end

-- 本函数负责require文件并加入到更新队列中
-- 由于目前SdkMgr的初始化是在UIAutoPatch的构造函数中进行的，这时被require的文件无法自动更新
-- 这里将这些文件记录下来，等到自动更新完成后重新update一次
function myRequire(path)
    trace("SdkMgr", "myRequire %s", path);
    require(path);
    table.insert(requiredFiles, path);
end

-- 更新已require的文件
function updateRequiredFiles()
    for _, path in ipairs(requiredFiles) do
        trace("SdkMgr", "update %s", path);
        update(path);
    end
end

-- 查询已require的文件
function queryRequiredFiles()
    trace("SdkMgr", "requiredFiles:%o", requiredFiles);
end

-- 处理所有来至Java的请求
function handleJavaFuncRequest(funcName, funcArgs)
    trace(PURE_FILE, "handleJavaFuncRequest:funcName = %s, funcArgs = %s", funcName, funcArgs);

    if javaCallbackList[funcName] then
        javaCallbackList[funcName](funcArgs);
    else
        trace(PURE_FILE, "### 回调(%s)不存在！", funcName);
    end
end

-------------------------
-- 注册Object-c的回调函数
-- @param funcName   回调函数名
-- @param callback   回调函数
function registerJavaCallback(funcName, callback)
    assert(type(funcName) == "string", "funcName必须为string类型");
    assert(type(callback) == "function", "callback必须为function类型");

    javaCallbackList[funcName] = callback;
end

-------------------------
-- 移除Object-c回调函数
-- @param funcName 回调函数名
function removeJavaCallback(funcName)
    javaCallbackList[funcName] = nil;
end

-- 输出回调列表
function getJavaCallbackList()
    return javaCallbackList;
end

-- 服务器充值到账的通知
function onServerRechargeOk(sku, serverTime, gem)
    callJavaFunc("onServerRechargeOk", { sku, serverTime, gem}, "(Ljava/lang/String;Ljava/lang/String;I)V");
end

-- 获取广告标识符
function getIdfa()
    local ret = callJavaFunc("getUniqueID", {}, "()Ljava/lang/String;");
    return ret;
end

